<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>02作用域</title>
    <!-- 
        JavaScript作用域：就是代码（变量）在某个范围内起作用和效果
            目的是为了提高程序的可靠性，更重要的是减少命名冲突。
        js的作用域（es6）之前：全局作用域  局部作用域
        全局作用域  整个script 标签 或者单独的一个js文件
        局部作用域（函数作用域）在函数内部的只作用于函数内部


       全局作用域下的变量即全局变量；函数内部没有声明直接赋值的变量也是全局变量
       局部作用域下的变量即局部变量；函数的形参可以看做局部变量
       全局变量只有关闭浏览器时才会销毁，占内存，在任何程序代码都可以使用


       现阶段js没有块级作用域 es6才新增块级作用域 块级作用域{}里面的区域

       作用域链：外层函数里面还有内层函数，内层函数访问外部的函数变量，采取的是链式查找方式。（就近原则）



       JavaScript预解析
            js解析器（引擎）运行js分为两步 预解析 代码执行
            预解析 把var 还有function开的头的代码 提升到 当前作用域 最前面
            代码执行 按照代码书写顺序执行代码

             var a = b = c = 9;
             等价于 var a=9 ; b=9 ;c=9
             如果要实现都先声明，应该写 var a=9,b=9,c=9;
             或者 var a=9;
             var b=9;
             var c=9;

        对象
            什么是对象，对象就是一个 具体的事物 ，具有相同性质的对象的抽象集合称为类
            在JavaScript中 对象时一组无序的相关属性和方法的集合 对象由属性和方法组成

            创建对象
                对象字面量 {}
                new Object
                构造函数 :可以一次创建多个对象 类 具有相同性质的对象的抽象集合称为类
                    语法格式
                    function(){
                        this.属性=值;
                        this.方法=function（）{

                        }
                    }
                    new 构造函数（）;

            使用对象
                调用对象的属性 对象.属性名 还有 对象名['属性名']
                调用对象的方法 对象.方法名（） 

            new 关键字 四件事
                    创建对象空间
                    this指向空间
                    执行对象实例化语句时 给属性赋值
                    返回对象

            对象遍历
                for in


    
     -->
    <script>
        console.log('JavaScript预解析');
        fn();
        function fn() {
            var a = b = c = 9;
            console.log(a);
            console.log(b);
            console.log(c);
        }
        console.log(c);
        console.log(b);
        // console.log(a);

        console.log(' 创建对象——对象字面量 {}');
        var obj = {
            uname: '张三疯',
            age: 18,
            sex: '男',
            sayHi: function () {
                console.log('hello');
            }

        }
        console.log(obj.sex);
        console.log(obj.uname);
        obj.sayHi();
        console.log(' 创建对象——new Object {}');

        var mR = new Object();
        // 创建对象
        mR.name = '鸣人';
        mR.sex = '男';
        mR.age = 19;
        mR.skill = function () {
            console.log('影分身术');
        };
        // 为对象的属性和方法赋值
        mR.skill();
        mR['name'];


        var dog = {
            name: '可可',
            type: '阿拉斯加犬',
            age: 5,
            color: '棕红色',
            bark: function () {
                console.log('bark');
            },
            showFilm: function () {
                console.log('showFilm');

            }
        }

        console.log(' 创建对象——构造函数');

        function Star() {
            this.name = arguments[0];
            this.age = arguments[1];
            this.sex = arguments[2];
            this.song = arguments[3]
            this.sing = function (song) {
                console.log(song);
            }
        }
        // 这里也可以使用形参和实参
        // 构造函数不需要return
        // 构造函数名用大写开头，每次调用函数就创建一个新的对象
        var ldh = new Star('刘德华', 18, '男', '冰雨');
        console.log(ldh.name);
        // console.log(ldh.song);
        ldh.sing('冰雨');

        console.log(' 创建对象——构造函数 王者荣耀创建英雄练习');

        function Hero(uname,type,blood,attack) {
            this.name = uname;
            this.type = type;
            this.blood = blood;
            this.attack = attack;

        }
        var lp = new Hero('廉颇', '力量型', '500血量', '近战');
        var hy = new Hero('后羿', '射手型', '100血量', '远程');
        console.log(lp.name);
        console.log(lp.type);
        console.log(lp.blood);
        console.log(lp.attack);
        console.log(hy.name);
        console.log(hy.type);
        console.log(hy.blood);
        console.log(hy.attack);
        console.log(' 创建对象——构造函数 王者荣耀创建英雄练习 对象的遍历');
        for(k in lp){
            console.log(k);
            // 对象属性名 也即键 key k
            console.log(lp[k]);
            // 对象属性值 这里使用对象属性调用方法 但是注意没有单引号
        }



    </script>
</head>

<body>

</body>

</html>